package com.lijinjiang.xml05;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

/**
 * @ClassName XPathDemo
 * @Description TODO
 * @Author Li
 * @Date 2022/9/21 21:33
 * @ModifyDate 2022/9/21 21:33
 * @Version 1.0
 */
public class XPathDemo {

    // 1.绝对路径：/根元素/子元素/子元素
    @Test
    public void parse01() throws Exception {
        // 1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        // 2.把 XML 加载成 Document 文档对象
        Document document = saxReader.read("src/com/lijinjiang/xml05/books.xml");
        // 3.检索全部名称
        List<Node> nodes = document.selectNodes("/books/book/name");
        // 4.遍历节点
        for (Node node : nodes) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
    }

    // 2.相对路径：./子元素/子元素（.代表了当前元素）
    @Test
    public void parse02() throws Exception {
        // 1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        // 2.把 XML 加载成 Document 文档对象
        Document document = saxReader.read("src/com/lijinjiang/xml05/books.xml");
        // 3.获取根元素
        Element rootElement = document.getRootElement();
        // 4.检索全部名称
        List<Node> nodes = rootElement.selectNodes("./book/name");
        // 5.遍历节点
        for (Node node : nodes) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
    }

    /**
     * 3.全文检索
     * //元素          在全文找这个元素
     * //元素1/元素2    在全文找元素1下面的一级元素2
     * //元素1//元素2   在全文找元素1下面的全部元素2
     */
    @Test
    public void parse03() throws Exception {
        // 1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        // 2.把 XML 加载成 Document 文档对象
        Document document = saxReader.read("src/com/lijinjiang/xml05/books.xml");
        // 3.检索全部名称
        List<Node> nodes01 = document.selectNodes("//name");
        // 4.遍历节点
        for (Node node : nodes01) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
        System.out.println("====================");
        // 3.检索全部名称
        List<Node> nodes02 = document.selectNodes("//book/name");
        // 4.遍历节点
        for (Node node : nodes02) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
        System.out.println("====================");
        // 3.检索全部名称
        List<Node> nodes03 = document.selectNodes("//novel//name");
        // 4.遍历节点
        for (Node node : nodes03) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
    }

    /**
     * 4.属性查找
     * //@属性名称          在全文检索属性对象
     * //元素[@属性名称]     在全文包含该属性的元素对象
     * //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象
     */
    @Test
    public void parse04() throws Exception {
        // 1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        // 2.把 XML 加载成 Document 文档对象
        Document document = saxReader.read("src/com/lijinjiang/xml05/books.xml");
        // 3.检索全部名称
        List<Node> nodes01 = document.selectNodes("//@sn");
        // 4.遍历节点
        for (Node node : nodes01) {
            Attribute attribute = (Attribute) node;
            System.out.println(attribute.getName() + "===>" + attribute.getValue());
        }
        System.out.println("====================");
        // 3.检索全部名称
        List<Node> nodes02 = document.selectNodes("//name[@id]");
        // 4.遍历节点
        for (Node node : nodes02) {
            Element element = (Element) node;
            String text = element.getTextTrim();
            System.out.println(text);
        }
        System.out.println("====================");
        // 3.检索全部名称
        Node nodes03 = document.selectSingleNode("//name[@id=2]");
        // 4.输出节点
        Element element = (Element) nodes03;
        String text = element.getTextTrim();
        System.out.println(text);
    }
}
